#include "connect_mysql.h"

char* strmov(char* dest, const char* src)
{
	while((*dest++ = *src++) != '\0')
		/*nothing */;

	return dest;
}



void connect_mysql(void)
{
	// mysql 객체를 초기화
	mysql_init(&mysql);

	conn= mysql_real_connect( &mysql,			// 초기화되는 접속 핸들러
							MYSQL_HOST,		// 서버가 돌아가는 호스트 이름
							MYSQL_USER, 	// 접속하여 사용할 아이디
							MYSQL_PASSWD,	// 사용자의 패스워드
							MYSQL_DATABASE,	// 접속할 데이터베이스의 이름
							0,				// 포트 번호
							(char*)NULL,	// 소켓에 대한 포인터
							0);				// 접속시 사용 할 플래그

	if(conn == NULL){
		fprintf(stderr, "데이터 베이스 연결 실패 %s\n", mysql_error(&mysql));
		return;
	}
}



void mysql_idcheck(USER* user)
{
	fprintf(stdout, "mysql_idcheck()\n");
	connect_mysql(); 

	// 입력 받은 데이터를 이용 쿼리를 생성
	sprintf(sqlbuf, SEARCH_QUERY, NAME, NAME, user->id);


	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;

	}
	
	sql_result = mysql_store_result(conn);

	sql_row = mysql_fetch_row(sql_result);


	if ( sql_row == 0 )
		user->result = OK;
	else
		user->result = NO;


	// res에 할당된 메모리를 해제한다.
	mysql_free_result(sql_result);

	// 서버와의 연결을 종료한다.
	mysql_close(&mysql);
}


void mysql_joincheck(USER* user)
{
	
	connect_mysql();

	// 입력 받은 데이터를 이용 쿼리를 생성
	sprintf(sqlbuf, INSERT_QUERY, user->id, user->password);

	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		user->result = FAIL;
		return ;
	}

	user->result = SUCCESS;
	
	// 서버와의 연결을 종료한다.
	mysql_close(&mysql);
	
}


void mysql_logincheck(USER* user)
{
	connect_mysql();

	// 입력 받은 데이터를 이용 쿼리를 생성
	sprintf(sqlbuf, SEARCH_QUERY, NAME, NAME, user->id);

	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;

	}

	sql_result = mysql_store_result(conn);

	sql_row = mysql_fetch_row(sql_result);


	if(sql_row != 0)
		user->result = SUCCESS;
	else{
		user->result = FAIL;
		user->fail_reason = FAIL_NO_ID;
	}

	sprintf(sqlbuf, SEARCH_QUERY, PASSWORD, PASSWORD, user->password);

	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		user->result = FAIL;
		user->fail_reason = FAIL_WRONG_PASSWORD;
		return;
	}

	sql_result = mysql_store_result(conn);

	sql_row = mysql_fetch_row(sql_result);

	if(sql_row == 0 || (strcmp(sql_row[0], user->password) != 0) )
	{
		user->result = FAIL;
		user->fail_reason = FAIL_WRONG_PASSWORD;
	}


	// 서버와의 연결을 종료한다.
	mysql_free_result(sql_result);
	mysql_close(&mysql);

}




void mysql_app_list(APP* app, char* ip)
{
   printf("mysql_app_list...\n");
	
	char buf[160];

	connect_mysql(); 

   printf("connect_mysql();\n");

	// 입력 받은 데이터를 이용 쿼리를 생성
	sprintf(sqlbuf, SEARCH_APP_NAME, app->name);

   printf("sprintf(sqlbuf, SEARCH_APP_NAME, app->name);\n");
	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;

	}
   printf("if(mysql_query(conn, sqlbuf))\n");

   sql_result = mysql_store_result(conn);
   printf("sql_result = mysql_store_result(conn);\n");

   sql_row = mysql_fetch_row(sql_result);
   printf("sql_row = mysql_fetch_row(sql_result);\n");


	// 어플리케이션 리스트 테이블에 이름이 존재하지 않을 경우
	if(sql_row == 0){
		
		// 입력 받은 데이터를 이용 쿼리를 생성
		sprintf(sqlbuf, APP_NAME_QUERY, app->name);

		if(mysql_query(conn, sqlbuf)){
			fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
			return;
		}
	}

   printf("if(sql_row == 0)\n");

	// 저장된 이름에 대한 id를 받아오기 위한 쿼리문
	sprintf(sqlbuf, SEARCH_APP_ID, app->name);
   printf("sprintf(sqlbuf, SEARCH_APP_ID, app->name);\n");

	if(mysql_query(conn, sqlbuf)){
		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;
	}
   printf("if(mysql_query(conn, sqlbuf))\n");

	sql_result = mysql_store_result(conn);
   printf("sql_result = mysql_store_result(conn);\n");

	sql_row = mysql_fetch_row(sql_result);
   printf("sql_row = mysql_fetch_row(sql_result);\n");

	sprintf(buf, APP_PATH_IP_QUERY, sql_row[0], ip);
   printf("sprintf(buf, APP_PATH_IP_QUERY, sql_row[0], ip);\n");

	char* end = strmov(sqlbuf,buf);
   printf("char* end = strmov(sqlbuf, buf);\n");
	end += mysql_real_escape_string(conn, end, app->apppath,
								  strlen(app->apppath));
   printf("	end += mysql_real_escape_string(conn, end, app->apppath, strlen(app->apppath));\n");


	*end++ = '\'';
   printf("*end++ = '\'';\n");

	*end++ = ')' ;
   printf("*end++ = ')';\n");

	if(mysql_real_query(conn, sqlbuf, (unsigned int)(end - sqlbuf))){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;
	}
   printf("if(mysql_real_query(conn, sqlbuf, (unsigned int)(end - sqlbuf)))\n");

	mysql_free_result(sql_result);
   printf("mysql_free_result(sql_result);\n");

	// 서버와의 연결을 종료한다.
	mysql_close(&mysql);
   printf("mysql_close(&mysql);\n");
	
   printf("mysql_app_list...end...\n");

}



//===========================================================
// 데이터베이스에 아이콘 이미지를 저장하는 함수 
//===========================================================
void mysql_icon_load(char* name)
{
   printf("mysql_icon_load...\n");
	connect_mysql();

	// 입력 받은 데이터를 이용 쿼리를 생성
	sprintf(sqlbuf, ICON_LOAD_QUERY, name, name);

	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;

	}

	mysql_close(&mysql);
   printf("mysql_icon_load....end...\n");
}


void mysql_server_stop(char *ip)
{
	fprintf(stdout, "mysql_server_stop\n");
	short i =  0;
	short max =  0;
	short count =  0;
	char *id_buf[100];

	connect_mysql();

	// ip를 통해서 applistoption 테이블의 applist_id를
	// 모두 얻어온다.
	
	sprintf(sqlbuf, SEARCH_APPLISTOPTION, ip);

	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;
	}

	// applist_id를 id_buf에 저장한다.
	sql_result = mysql_store_result(conn);

	while((sql_row =  mysql_fetch_row(sql_result)) !=  NULL)
	{
		id_buf[i] = sql_row[0];
		printf("%s\n", id_buf[i]);
		i++;

	}

	max = i - 1;
	i = 0;

	// 저장한 applist_id를 검색하여 저장된 수를 파악한다.
	// 1개이면 applist의 row를 삭제한다.
	// 2개이면 다른 서버가 아직 존재하기 때문에 applistoption의
	// 모든 row는 지우지만 applist의 row는 삭제를 하면 안된다.
	
	while(max == i)
	{
		sprintf(sqlbuf, SEARCH_APPLIST_ID, id_buf[i]);

		if(mysql_query(conn, sqlbuf)){

			fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
			return;
		}

		while((sql_row = mysql_fetch_row(sql_result)) != NULL)

			count++;

		if(count == 1){

			// 1개 이상일때 applist의 row를 삭제한다.
			sprintf(sqlbuf, APPLIST_DELETE, id_buf[i]);

			if(mysql_query(conn, sqlbuf)){

				fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
				return;
			}
		}

		i++;
	}

	sprintf(sqlbuf, APPLISTOPTION_DELETE, ip);

	if(mysql_query(conn, sqlbuf)){

		fprintf(stderr, "질의 실패 %s\n", mysql_error(conn));
		return;
	}

	mysql_free_result(sql_result);

	mysql_close(&mysql);
}



